﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using CapaNegocio;
using CapaDatos;

public partial class abmObra_GestionarObra : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["UsuLogin"] == null)
        {
            Response.Redirect("../Default.aspx", true);
        }
        else
        {
            if (!IsPostBack)
            {
                Usuario usu = ((Usuario)(Session["UsuLogin"]));
                Label1.Text = usu.Apellido + ", " + usu.Nombre + " (" + usu.Perfil.Nombre + ")";
                Session["etapas"] = new List<EtapaObra>();

                if (Session["OrdenTrabajo"] != null && ((OrdenTrabajo)Session["OrdenTrabajo"]).Codigo != 0)
                {
                    botonBuscarOT.Visible = false;
                    txtOT.Enabled = false;
                    txtOT.Text = Convert.ToString(((OrdenTrabajo)Session["OrdenTrabajo"]).Codigo);
                    botonBuscarOT_Click(sender, e);
                }
            }
        }
    }

    protected void botonVolver_Click(object sender, EventArgs e)
    {

        if (Request.QueryString["view"] != null && Request.QueryString["view"] == "ot")
        {
            Response.Redirect("../abmOrdenesTrabajo/ConsultarOrdenes.aspx");
        }
        else
        {
            Response.Redirect("AdministrarOrdenesAsignadas.aspx");
        }
    }

    protected void botonBuscarOT_Click(object sender, EventArgs e)
    {
        if (!String.IsNullOrEmpty(txtOT.Text))
        {
            List<EtapaObra> etapas = EtapaObra.buscarEtapas(Convert.ToInt32(txtOT.Text));

            if (etapas.Count > 0)
            {
                Session["etapas"] = etapas;
                txtEstado.Text = etapas.ElementAt(0).OrdenTrabajo.EstadoOT.Descripcion;
                txtFechaInicioOT.Text = etapas.ElementAt(0).OrdenTrabajo.FechaComienzo.ToShortDateString();
                popularTabla(etapas);
                panelEtapas.Visible = true;
            }
            else {
                panelEtapas.Visible = false;
                Session["etapas"] = new List<EtapaObra>();
                txtEstado.Text = "";
                txtFechaInicioOT.Text = "";

            }
            
         }
    }

    private void popularTabla(List<EtapaObra> etapas)
    {
        if (etapas.Count >= 1)
        {
            PanelE1.Visible = true;
            completarInformacionDeEtapa(etapas.ElementAt(0), lblDescripcionE1,
                lblFechaInicioE1, lblFechaFinE1, lblDiasTotE1, txtFechaInicioRealE1, txtFechaFinRealE1, ImageE1, botonAceptarE1);
        }

        if (etapas.Count >= 2 && isEtapaAnteriorCompleta(etapas.ElementAt(0)))
        {
            PanelE2.Visible = true;
            completarInformacionDeEtapa(etapas.ElementAt(1), lblDescripcionE2,
               lblFechaInicioE2, lblFechaFinE2, lblDiasTotE2, txtFechaInicioRealE2, txtFechaFinRealE2, ImageE2, botonAceptarE2);
        }

        if (etapas.Count >= 3 && isEtapaAnteriorCompleta(etapas.ElementAt(1)))
        {
            PanelE3.Visible = true;
            completarInformacionDeEtapa(etapas.ElementAt(2), lblDescripcionE3,
                lblFechaInicioE3, lblFechaFinE3, lblDiasTotE3, txtFechaInicioRealE3, txtFechaFinRealE3, ImageE3, botonAceptarE3);
           
        }

        if (etapas.Count >= 4 && isEtapaAnteriorCompleta(etapas.ElementAt(2)))
        {
            PanelE4.Visible = true;
            completarInformacionDeEtapa(etapas.ElementAt(3), lblDescripcionE4,
               lblFechaInicioE4, lblFechaFinE4, lblDiasTotE4, txtFechaInicioRealE4, txtFechaFinRealE4, ImageE4, botonAceptarE4);
        }

        if (etapas.Count >= 5 && isEtapaAnteriorCompleta(etapas.ElementAt(3)))
        {

            PanelE5.Visible = true;
            completarInformacionDeEtapa(etapas.ElementAt(4), lblDescripcionE5,
                lblFechaInicioE5, lblFechaFinE5, lblDiasTotE5, txtFechaInicioRealE5, txtFechaFinRealE5, ImageE5, botonAceptarE5);
        }

        if (etapas.Count >= 6 && isEtapaAnteriorCompleta(etapas.ElementAt(4)))
        {
            PanelE6.Visible = true;
            completarInformacionDeEtapa(etapas.ElementAt(5), lblDescripcionE6,
               lblFechaInicioE6, lblFechaFinE6, lblDiasTotE6, txtFechaInicioRealE6, txtFechaFinRealE6, ImageE6, botonAceptarE6);
        }

        if (etapas.Count == 7 && isEtapaAnteriorCompleta(etapas.ElementAt(5)))
        {
            PanelE7.Visible = true;
            completarInformacionDeEtapa(etapas.ElementAt(6), lblDescripcionE7,
               lblFechaInicioE7, lblFechaFinE7, lblDiasTotE7, txtFechaInicioRealE7, txtFechaFinRealE7, ImageE7, botonAceptarE7);
        }
    }


    private void mostrarAcciones(Image i, DateTime fechaIni, DateTime FechaFin, TextBox txtIni,TextBox txtFin,Button botonActualizar)
    {
        if (fechaIni != default(DateTime) && FechaFin == default(DateTime))
        { 
            i.Visible = true;
            txtIni.Enabled = false;
            txtFin.Enabled = true;
            botonActualizar.Visible = true;
        }

        if (fechaIni != default(DateTime) && FechaFin != default(DateTime))
        {
            txtIni.Enabled = false;
            txtFin.Enabled = false;
            i.Visible = false;
            botonActualizar.Visible = false;
        }

        if (fechaIni == default(DateTime) && FechaFin == default(DateTime))
        {
            txtIni.Enabled = true;
            txtFin.Enabled = false;
            botonActualizar.Visible = true;
        }
    }

    private void completarInformacionDeEtapa(EtapaObra eo,Label lblDescripcion, 
        Label lblFechaInicio, Label lblFechaFin,Label lblDiasTot, 
        TextBox txtFechaInicioReal, TextBox txtFechaFinReal,Image img,Button botonActualizar)
    {

        lblDescripcion.Text = eo.Etapa.Descripcion;
        lblFechaInicio.Text = eo.FechaInicio.ToShortDateString();
        lblFechaFin.Text = eo.FechaFin.ToShortDateString();
        lblDiasTot.Text = Convert.ToString(eo.DiasTotalesEstipulados());
        if (eo.FechaInicioReal != default(DateTime))
        {
            txtFechaInicioReal.Text = eo.FechaInicioReal.ToShortDateString();
        }

        if (eo.FechaFinReal != default(DateTime))
        {
            txtFechaFinReal.Text = eo.FechaFinReal.ToShortDateString();
        }

        mostrarAcciones(img, eo.FechaInicioReal, eo.FechaFinReal, txtFechaInicioReal, txtFechaFinReal, botonActualizar);

    }

    private bool actualizarEtapa(EtapaObra eo,TextBox txtFechaInicioReal,TextBox txtFechaFinReal){

        bool modificacionOk = false;
        if (eo.FechaInicioReal == default(DateTime) || eo.FechaFinReal == default(DateTime))
        {
            if (!String.IsNullOrEmpty(txtFechaInicioReal.Text) || (!String.IsNullOrEmpty(txtFechaFinReal.Text)))
            {

                if (!String.IsNullOrEmpty(txtFechaInicioReal.Text) && (String.IsNullOrEmpty(txtFechaFinReal.Text)))
                {
                    if (eo.getEtapaAnteriorReal() == null && DateTime.Compare(eo.FechaInicio, Convert.ToDateTime(txtFechaInicioReal.Text)) == 1)
                    {
                        mensaje.Visible = true;
                        mensaje.Text = eo.Etapa.Descripcion+": La fecha de comienzo debe ser igual o mayor a la fecha de inicio del orden de trabajo estimada.";
                    }
                    else if (eo.getEtapaAnteriorReal()!=null && DateTime.Compare(eo.getEtapaAnteriorReal().FechaFinReal, Convert.ToDateTime(txtFechaInicioReal.Text)) == 1)
                    {
                        mensaje.Visible = true;
                        mensaje.Text = eo.Etapa.Descripcion+": La fecha de comienzo debe ser igual o mayor a la fecha de fin de la etapa anterior "+eo.getEtapaAnteriorReal().Etapa.Descripcion; 

                    }else{
                    
                        modificacionOk = eo.modificarEtapa(txtFechaInicioReal.Text, txtFechaFinReal.Text);
                    
                    }
                }
                else
                {
                    if (!String.IsNullOrEmpty(txtFechaInicioReal.Text) && (!String.IsNullOrEmpty(txtFechaFinReal.Text)))
                    {

                        if (DateTime.Compare(Convert.ToDateTime(txtFechaInicioReal.Text), Convert.ToDateTime(txtFechaFinReal.Text)) == 1)
                        {
                            mensaje.Visible = true;
                            mensaje.Text = eo.Etapa.Descripcion+": La fecha de fin debe ser igual o mayor a la fecha de inicio de la etapa en curso.";
                        }
                        else
                        {

                            modificacionOk = eo.modificarEtapa(txtFechaInicioReal.Text, txtFechaFinReal.Text);
                            if (eo.Etapa.Codigo == (int)EtapaEnum.CONTRAPISO_PERIMETRAL) {
                                eo.OrdenTrabajo.actualizarFinOT();
                            }
                        }
                    }
                }
            }
            else {
                mensaje.Visible = true;
                mensaje.Text = "No asigno fechas validas.";
            }
        }

        return modificacionOk;
    }

    private bool isEtapaAnteriorCompleta(EtapaObra eo) {
        return eo.FechaInicioReal != default(DateTime) && eo.FechaFinReal != default(DateTime);
    }

    protected void botonAceptarE1_Click(object sender, EventArgs e)
    {
        List<EtapaObra> etapas =(List<EtapaObra>)Session["etapas"];

        if ((!String.IsNullOrEmpty(txtFechaInicioRealE1.Text) || !String.IsNullOrEmpty(txtFechaFinRealE1.Text))
           && (etapas.ElementAt(0).FechaInicioReal == default(DateTime) && etapas.ElementAt(0).FechaFinReal == default(DateTime)))
        {
            etapas.ElementAt(0).OrdenTrabajo.modificarOT((int)EstadoOTEnum.OT_COMENZADA);
        }

        botonAceptar(etapas.ElementAt(0), txtFechaInicioRealE1, txtFechaFinRealE1);
        
    }

    protected void botonAceptarE2_Click(object sender, EventArgs e)
    {
        List<EtapaObra> etapas = (List<EtapaObra>)Session["etapas"];
        botonAceptar(etapas.ElementAt(1), txtFechaInicioRealE2, txtFechaFinRealE2);
    }

    protected void botonAceptarE3_Click(object sender, EventArgs e)
    {
        List<EtapaObra> etapas = (List<EtapaObra>)Session["etapas"];
        botonAceptar(etapas.ElementAt(2), txtFechaInicioRealE3, txtFechaFinRealE3);
    }

    protected void botonAceptarE4_Click(object sender, EventArgs e)
    {
        List<EtapaObra> etapas = (List<EtapaObra>)Session["etapas"];
        botonAceptar(etapas.ElementAt(3), txtFechaInicioRealE4, txtFechaFinRealE4);
    }

    protected void botonAceptarE5_Click(object sender, EventArgs e)
    {
        List<EtapaObra> etapas = (List<EtapaObra>)Session["etapas"];
        botonAceptar(etapas.ElementAt(4), txtFechaInicioRealE5, txtFechaFinRealE5);
    }

    protected void botonAceptarE6_Click(object sender, EventArgs e)
    {
        List<EtapaObra> etapas = (List<EtapaObra>)Session["etapas"];
        botonAceptar(etapas.ElementAt(5), txtFechaInicioRealE6, txtFechaFinRealE6);
    }

    protected void botonAceptarE7_Click(object sender, EventArgs e)
    {
        List<EtapaObra> etapas = (List<EtapaObra>)Session["etapas"];


        botonAceptar(etapas.ElementAt(6), txtFechaInicioRealE7, txtFechaFinRealE7);
    }

    private void botonAceptar(EtapaObra eo,TextBox txtFechaInicioReal, TextBox txtFechaFinReal) {
        bool modificacionOk = false;
        modificacionOk = actualizarEtapa(eo, txtFechaInicioReal, txtFechaFinReal);

        if (modificacionOk)
        
        {

            if (eo.Etapa.Codigo == (int)EtapaEnum.CONTRAPISO_PERIMETRAL)
            {

                OrdenTrabajo o = eo.OrdenTrabajo;

                Asignacion a = Asignacion.buscarAsignacion(o);

                a.actualizarFinEtapa();
            }

            Session["mensaje"] = "La etapa " + eo.Etapa.Descripcion + " se encuentra correctamente actualizada.";
            Session["ruta"] = "abmObra/GestionarObra.aspx";
            Response.Redirect("../Exito.aspx");
        }
    }

}